package com.joven.product.service.infrastructure.persistence.db.dao.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.joven.product.service.infrastructure.persistence.db.dao.ProductDao;
import com.joven.product.service.infrastructure.persistence.db.mapper.ProductMapper;
import com.joven.product.service.infrastructure.persistence.db.entity.ProductDO;
import com.joven.product.service.infrastructure.persistence.db.query.ProductPageQuery;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * 商品接口实现
 *
 * @author Joven
 * @date 2022-01-06 18:21:27
 */
@Service
public class ProductDaoImpl extends ServiceImpl<ProductMapper, ProductDO> implements ProductDao {
    @Override
    public ProductDO getById(Long id) {
        return super.getById(id);
    }

    @Override
    public Page<ProductDO> getByPage(Page<ProductDO> page, ProductPageQuery query) {
        LambdaQueryWrapper<ProductDO> wrapper = Wrappers.<ProductDO>lambdaQuery()
                .eq(Objects.nonNull(query.getId()), ProductDO::getId, query.getId())
                .eq(StringUtils.isNotBlank(query.getCode()), ProductDO::getCode, query.getCode())
                .eq(Objects.nonNull(query.getStatus()), ProductDO::getStatus, query.getStatus())
                .eq(Objects.nonNull(query.getCategoryId()), ProductDO::getCategoryId, query.getCategoryId())
                .eq(Objects.nonNull(query.getSupplierId()), ProductDO::getSupplierId, query.getSupplierId())
                .eq(Objects.nonNull(query.getCreateUser()), ProductDO::getCreateUser, query.getCreateUser())
                .eq(Objects.nonNull(query.getUpdateUser()), ProductDO::getUpdateUser, query.getUpdateUser())
                .likeLeft(StringUtils.isNotBlank(query.getName()), ProductDO::getName, query.getName())
                .ge(Objects.nonNull(query.getFromPrice()), ProductDO::getPrice, query.getFromPrice())
                .le(Objects.nonNull(query.getToPrice()), ProductDO::getPrice, query.getToPrice())
                .ge(Objects.nonNull(query.getFromCreateTime()), ProductDO::getCreateTime, query.getFromCreateTime())
                .le(Objects.nonNull(query.getToCreateTime()), ProductDO::getCreateTime, query.getToCreateTime())
                .ge(Objects.nonNull(query.getFromUpdateTime()), ProductDO::getUpdateTime, query.getFromUpdateTime())
                .le(Objects.nonNull(query.getToUpdateTime()), ProductDO::getUpdateTime, query.getToUpdateTime());
        return page(page, wrapper);
    }
}
